#include <iostream>
#include <cstring>
using namespace std;

const int N = 310;
const int dx[4] = {1, -1, 0, 0};
const int dy[4] = {0, 0, 1, -1};

int r, c;    //取得行列数
int g[N][N]; //存储图
int f[N][N]; //状态表示
int res = 0; //存储答案

int dp(int x, int y)
{
    if (f[x][y] != -1) //如果已经初始化过了
        return f[x][y];
    //没初始化就状态划分
    f[x][y] = 1; //如果一动不动，长度为1
    for (int i = 0; i < 4; ++i)
    {
        int a = x + dx[i];
        int b = y + dy[i];
        if (a >= 0 && a < r && b >= 0 && b < c && g[a][b] < g[x][y]) //如果这个地方没出界而且下一步可到达
            f[x][y] = max(f[x][y], dp(a, b) + 1);
    }
    return f[x][y];
}

int main()
{
    freopen("cin.txt", "r", stdin);
    cin >> r >> c;
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            cin >> g[i][j];
    memset(f, -1, sizeof f); //初始化所有状态，-1就表示没初始化
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            res = max(res, dp(i, j));
    cout << res;
    return 0;
}